package com.imooc.course.generator.util;

import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;

public class FreemarkerUtil {

    private Template temp;
    private String ftlPath = "generator\\src\\main\\java\\com\\imooc\\course\\generator\\ftl\\";

    public static FreemarkerUtil init() {
        FreemarkerUtil fu = new FreemarkerUtil();
        return fu;
    }

    public static FreemarkerUtil init(String ftlPath) {
        FreemarkerUtil fu = new FreemarkerUtil();
        fu.ftlPath = fu.ftlPath + ftlPath;
        return fu;
    }

    public FreemarkerUtil config(String ftl) throws IOException {
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_29);
        //第一种：基于类路径，指定(路径参数)包下的framemaker.ftl文件
        //cfg.setClassForTemplateLoading(this.getClass(), "/HttpWeb");
        //第三种：基于Servlet Context，用的少，不了解。
        //第二种：基于文件系统，这里使用第二种
        cfg.setDirectoryForTemplateLoading(new File(ftlPath));
        cfg.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_29));
        this.temp = cfg.getTemplate(ftl);
        return this;
    }

    public void generator(String fileName, Map<String,Object> map) throws IOException, TemplateException {
        /*
         * 这里的fileName是相对路径，并没有指明盘符，那么它是如何知道在哪里是相对路径的起点从而创建？
         * FileWriter的底层有用File类来实现，而File类通过相对路径创建一系列的文件或文件夹时，
         * 它的逻辑是：
         * 从当前java工程目录位置开始直至目标文件或文件夹的路径
         * 或者
         * (如果不是一个工程)从当前java文件位置开始直至目标文件夹或文件的路径
         * 猜测File类应该是做了判断，如果不是从当前java工程目录位置开始，就是从当前java文件位置开始，
         * 所以，即使不指明盘符File也能准确找到创建的起点。
         */
        FileWriter fw = new FileWriter(fileName);
        BufferedWriter bw = new BufferedWriter(fw);
        temp.process(map, bw);
        bw.flush();
        fw.close();
    }

}
